﻿using HamcoWcs.Models.DeviceMsgs.BconMsgs.BconRecvTel;
using System;
using System.Collections.Generic;
using System.Text;

namespace HamcoWcs.Models.DeviceMsgs.BconMsgs
{
    public class BconMsg
    {
        public string Pack_Head { get; set; }
        public string Pack_Nr { get; set; }
        public string Pack_Length { get; set; }
        public string Pack_CRC { get; set; }
        public string Pack_ACK_Nr { get; set; }
        public string Pack_ACK_St { get; set; }
        public string Sender_ID { get; set; }
        public string Receiver_ID { get; set; }
        public DateTime Time_Stamp { get; set; }
        public List<BconBaseTel> Datas { get; set; }
        public string Pack_End { get; set; }
        public int SendNum { get; set; }
        public BconMsg() { }
        public BconMsg(string msg)
        {
            Pack_Head = msg.Substring(0, 2);
            Pack_Nr = msg.Substring(2, 4);
            Pack_Length = msg.Substring(6, 4);
            Pack_CRC = msg.Substring(10, 4);
            Pack_ACK_Nr = msg.Substring(14, 4);
            Pack_ACK_St = msg.Substring(18, 2);
            Sender_ID = msg.Substring(20, 3);
            Receiver_ID = msg.Substring(23, 3);
            Time_Stamp = DateTime.Now;
            Pack_End = msg.Substring(msg.Length - 2, 2);
            if (msg.Length > 45)
            {
                Datas = new List<BconBaseTel>();
                var datas = msg.Substring(43).Split("<<");
                foreach (var data in datas)
                {
                    if (data.Length < 5)
                        continue;
                    var dataDto = GetBconTelDto(data);
                    if (dataDto != null)
                        Datas.Add(dataDto);
                }
            }
        }
        public string Encode()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(Pack_Head);
            sb.Append(Pack_Nr);
            sb.Append("lent");
            sb.Append(Pack_CRC);
            sb.Append(Pack_ACK_Nr);
            sb.Append(Pack_ACK_St);
            sb.Append(Sender_ID);
            sb.Append(Receiver_ID);
            sb.Append(Time_Stamp.ToString("YYYYMMDDHHMMSSmmm"));
            foreach (var data in Datas)
            {
                sb.Append(data.Encode());
            }
            sb.Append(Pack_End);
            sb.Replace("lent", sb.Length.ToString().PadLeft(4, '0'));
            return sb.ToString();
        }
        private BconBaseTel GetBconTelDto(string data)
        {
            switch (data.Substring(0, 2))
            {
                case "AR": return new BconTel_AR(data);
                case "BR": return new BconTel_BR(data);
                case "DR": return new BconTel_DR(data);
                case "DS": return new BconTel_DS(data);
                case "DU": return new BconTel_DU(data);
                case "OL": return new BconTel_OL(data);
                case "SR": return new BconTel_SR(data);
                default: return null;
            }
        }
    }
}
